package parser.nodes;

// FPSection = ['VAR'] IdentList ':' Type

import codegen.CodeGen;
import codegen.ParamDescr;
import codegen.VarDescr;
import java.util.ArrayList;
import java.util.List;
import scanner.Token;

public class FPSectionNode extends Node {
    private boolean isVar;
    private IdentListNode idents;
    private TypeNode type;

    public FPSectionNode(boolean isVar, IdentListNode idents, TypeNode type) {
        this.isVar = isVar;
        this.idents = idents;
        this.type = type;
    }

    public List<Token> getIdents() {
        return idents.getIdentList();
    }

    public boolean isIsVar() {
        return isVar;
    }

    public TypeNode getType() {
        return type;
    }
    
    @Override
    public void print() {
        p("FPSection:");
        indent();
        if (isVar) 
            p("VAR");
        idents.print();
        p(":");
        type.print();
        unindent();
    }

    @Override
    public void abstractPrint() {
        p("FORMALPARAM");
        indent();
        if (isVar)
            p("VAR");
        idents.abstractPrint();
        type.abstractPrint();
        unindent();
    }
	
	/**
	 * Diese Methode erzeugt aus dem Section Node eine Liste von Deskriptoren
	 * @param c Der Codegen mit einem neuen level für die parameter. Codegen wird für die verifizierung benötigt
	 * @return Liste von Deskriptoren, die eingetragen wurden, beim Fehler wird ein CompileError geworfen
	 */
	public List<ParamDescr> getParamDescrList(CodeGen c) throws CompileError {
		List<ParamDescr> result = new ArrayList<>();
		for(Token ident : getIdents()) {
			VarDescr var = new VarDescr(c.nextFreeAddress(), type.getDescriptor(c) , c.getLevel());
			c.putDescr(ident.toString(), var);
			result.add(new ParamDescr(ident.toString(), var, isVar));
		}
		return result;
	}
}
